青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小默

【轉】HTTP Document API //TOFILE


This is an introduction to the CouchDB HTTP document API.

Naming/Addressing

Documents stored in a CouchDB have a DocID. DocIDs are case-sensitive string identifiers that uniquely identify a document. Two documents cannot have the same identifier in the same database, they are considered the same document.

 

http://localhost:5984/test/some_doc_id
http://localhost:5984/test/another_doc_id
http://localhost:5984/test/BA1F48C5418E4E68E5183D5BD1F06476


The above URLs point to some_doc_id, another_doc_id and BA1F48C5418E4E68E5183D5BD1F06476 in the database test.

Documents

A CouchDB document is simply a JSON object. You can use any JSON structure with nesting. You can fetch the document's revision information by adding ?revs=true or ?revs_info=true to the get request.

Here are two simple examples of documents:

{
"_id":"discussion_tables",
"_rev":"D1C946B7",
"Sunrise":true,
"Sunset":false,
"FullHours":[1,2,3,4,5,6,7,8,9,10],
"Activities": [
{
"Name":"Football""Duration":2"DurationUnit":"Hours"},
{
"Name":"Breakfast""Duration":40"DurationUnit":"Minutes""Attendees":["Jan""Damien""Laura""Gwendolyn""Roseanna"]}
]
}

{
"_id":"some_doc_id",
"_rev":"D1C946B7",
"Subject":"I like Plankton",
"Author":"Rusty",
"PostedDate":"2006-08-15T17:30:12-04:00",
"Tags":["plankton""baseball""decisions"],
"Body":"I decided today that I don't like baseball. I like plankton."
}

Special Fields

Note that any top-level fields with a name that starts with a _ prefix are reserved for use by CouchDB itself. Also see Reserved_words. Currently (0.10+) reserved fields are:

Field Name

Description

_id

The unique identifier of the document (mandatory and immutable)

_rev

The current MVCC-token/revision of this document (mandatory and immutable)

_attachments

If the document has attachments, _attachments holds a (meta-)data structure (see section on HTTP_Document_API#Attachments)

_deleted

Indicates that this document has been deleted and will be removed on next compaction run

_revisions

If the document was requested with ?revs=true this field will hold a simple list of the documents history

_rev_infos

Similar to _revisions, but more details about the history and the availability of ancient versions of the document

_conflicts

Information about conflicts

_deleted_conflicts

Information about conflicts

Document IDs

Document IDs don't have restrictions on what characters can be used. Although it should work, it is recommended to use non-special characters for document IDs. Using special characters you have to be aware of proper URL en-/decoding. Documents prefixed with _ are special documents:

Document ID prefix

Description

_design/

are DesignDocuments

_local/

are not being replicated (local documents) and used for Replication checkpointing.

You can have / as part of the document ID but if you refer to a document in a URL you must always encode it as %2F. One special case is _design/ documents, those accept either / or %2F for the / after _design, although / is preferred and %2F is still needed for the rest of the DocID.

Working With Documents Over HTTP

GET

To retrieve a document, simply perform a GET operation at the document's URL:

GET /somedatabase/some_doc_id HTTP/1.0

Here is the server's response:

HTTP/1.1 200 OK
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"_id":"some_doc_id",
"_rev":"946B7D1C",
"Subject":"I like Plankton",
"Author":"Rusty",
"PostedDate":"2006-08-15T17:30:12Z-04:00",
"Tags":["plankton""baseball""decisions"],
"Body":"I decided today that I don't like baseball. I like plankton."
}

Accessing Previous Revisions

See DocumentRevisions for additional notes on revisions.

The above example gets the current revision. You may be able to get a specific revision by using the following syntax:

GET /somedatabase/some_doc_id?rev=946B7D1C HTTP/1.0

To find out what revisions are available for a document, you can do:

GET /somedatabase/some_doc_id?revs=true HTTP/1.0

This returns the current revision of the document, but with an additional field, _revisions, the value being a list of the available revision IDs. Note though that not every of those revisions of the document is necessarily still available. For example, the content of an old revision get removed by compacting the database, or it may only exist in a different database if it was replicated.

To get more detailed information about the available document revisions, use the revs_info parameter instead. In this case, the JSON result will contain a _revs_info property, which is an array of objects, for example:

{
"_revs_info": [
{
"rev""123456""status""disk"},
{
"rev""234567""status""missing"},
{
"rev""345678""status""deleted"},
]
}

Here, disk means the revision content is stored on disk and can still be retrieved. The other values indicate that the content of that revision is not available.

You can fetch the bodies of multiple revisions at once using the parameter open_revs=["rev1","rev2",...], or you can fetch all leaf revisions using open_revs=all (see Replication_and_conflicts). The JSON returns an array of objects with an "ok" key pointing to the document, or a "missing" key pointing to the rev string.

[
{
"missing":"1-fbd8a6da4d669ae4b909fcdb42bb2bfd"},
{
"ok":{"_id":"test","_rev":"2-5bc3c6319edf62d4c624277fdd0ae191","hello":"foo"}}
]

PUT

To create new document you can either use a POST operation or a PUT operation. To create/update a named document using the PUT operation, the URL must point to the document's location.

The following is an example HTTP PUT. It will cause the CouchDB server to generate a new revision ID and save the document with it.

PUT /somedatabase/some_doc_id HTTP/1.0
Content
-Length: 245
Content
-Type: application/json
{
"Subject":"I like Plankton",
"Author":"Rusty",
"PostedDate":"2006-08-15T17:30:12-04:00",
"Tags":["plankton""baseball""decisions"],
"Body":"I decided today that I don't like baseball. I like plankton."
}

Here is the server's response.

HTTP/1.1 201 Created
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"ok"true"id""some_doc_id""rev""946B7D1C"}

To update an existing document, you also issue a PUT request. In this case, the JSON body must contain a _rev property, which lets CouchDB know which revision the edits are based on. If the revision of the document currently stored in the database doesn't match, then a 409 conflict error is returned.

If the revision number does match what's in the database, a new revision number is generated and returned to the client.

For example:

PUT /somedatabase/some_doc_id HTTP/1.0
Content
-Length: 245
Content
-Type: application/json
{
"_id":"some_doc_id",
"_rev":"946B7D1C",
"Subject":"I like Plankton",
"Author":"Rusty",
"PostedDate":"2006-08-15T17:30:12-04:00",
"Tags":["plankton""baseball""decisions"],
"Body":"I decided today that I don't like baseball. I like plankton."
}

Here is the server's response if what is stored in the database is revision 946B7D1C of document some_doc_id.

HTTP/1.1 201 Created
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"ok":true"id":"some_doc_id""rev":"2774761002"}

And here is the server's response if there is an update conflict (what is currently stored in the database is not revision 946B7D1C of document some_doc_id).

HTTP/1.1 409 Conflict
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Length: 33
Connection: close
{
"error":"conflict","reason":"Document update conflict."}

There is a query option batch=ok which can be used to achieve higher throughput at the cost of lower guarantees. When a PUT (or a document POST as described below) is sent using this option, it is not immediately written to disk. Instead it is stored in memory on a per-user basis for a second or so (or the number of docs in memory reaches a certain point). After the threshold has passed, the docs are committed to disk. Instead of waiting for the doc to be written to disk before responding, CouchDB sends an HTTP 202 Accepted response immediately.

batch=ok is not suitable for crucial data, but it ideal for applications like logging which can accept the risk that a small proportion of updates could be lost due to a crash. Docs in the batch can also be flushed manually using the _ensure_full_commit API.

POST

The POST operation can be used to create a new document with a server generated DocID. To create a named document, use the PUT method instead. It is recommended that you avoid POST when possible, because proxies and other network intermediaries will occasionally resend POST requests, which can result in duplicate document creation. If your client software is not capable of guaranteeing uniqueness of generated UUIDs, use a GET to /_uuids?count=100 to retrieve a list of document IDs for future PUT requests. Please note that the /_uuids-call does not check for existing document ids; collision-detection happens when you are trying to save a document.

The following is an example HTTP POST. It will cause the CouchDB server to generate a new DocID and revision ID and save the document with it.

POST /somedatabase/ HTTP/1.0
Content
-Length: 245
Content
-Type: application/json
{
"Subject":"I like Plankton",
"Author":"Rusty",
"PostedDate":"2006-08-15T17:30:12-04:00",
"Tags":["plankton""baseball""decisions"],
"Body":"I decided today that I don't like baseball. I like plankton."
}

Here is the server's response:

HTTP/1.1 201 Created
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"ok":true"id":"123BAC""rev":"946B7D1C"}

DELETE

To delete a document, perform a DELETE operation at the document's location, passing the rev parameter with the document's current revision. If successful, it will return the revision id for the deletion stub.

DELETE /somedatabase/some_doc?rev=1582603387 HTTP/1.0

As an alternative you can submit the rev parameter with the etag header field If-Match.

DELETE /somedatabase/some_doc HTTP/1.0
If
-Match: "1582603387"

And the response:

HTTP/1.1 200 OK
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"ok":true,"rev":"2839830636"}

COPY

Note that this is a non-standard extension to HTTP.

You can copy documents by sending an HTTP COPY request. This allows you to duplicate the contents (and attachments) of a document to a new document under a different document id without first retrieving it from CouchDB. Use the Destination header to specify the document that you want to copy to (the target document).

It is not possible to copy documents between databases and it is not (yet) possible to perform bulk copy operations.

COPY /somedatabase/some_doc HTTP/1.1
Destination: some_other_doc

If you want to overwrite an existing document, you need to specify the target document's revision with a rev parameter in the Destination header:

COPY /somedatabase/some_doc HTTP/1.1
Destination: some_other_doc
?rev=rev_id

The response in both cases includes the target document's revision:

HTTP/1.1 201 Created
Server: CouchDB
/0.9.0a730122-incubating (Erlang OTP/R12B)
Etag: 
"355068078"
Date: Mon, 
05 Jan 2009 11:12:49 GMT
Content
-Type: text/plain;charset=utf-8
Content
-Length: 41
Cache
-Control: must-revalidate
{
"ok":true,"id":"some_other_doc","rev":"355068078"}

MOVE

For a ~6 month period CouchDB trunk between versions 0.8 and 0.9 included the nonstandard MOVE method. Since MOVE is really just COPY & DELETE and CouchDB can not reasonably guarantee atomicity between the COPY & MOVE operations on a single or on multiple nodes, this was removed before the release of CouchDB 0.9.

Bulk Docs

For information about editing multiple documents at the same time, see HTTP_Bulk_Document_API

All Documents

To get a listing of all documents in a database, use the special _all_docs URI. This is a specialized View so the Querying Options of the HTTP_view_API apply here.

GET somedatabase/_all_docs HTTP/1.0

Will return a listing of all documents and their revision IDs, ordered by DocID (case sensitive):

HTTP/1.1 200 OK
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"total_rows"3"offset"0"rows": [
{
"id""doc1""key""doc1""value": {"rev""4324BB"}},
{
"id""doc2""key""doc2""value": {"rev":"2441HF"}},
{
"id""doc3""key""doc3""value": {"rev":"74EC24"}}
]
}

Use the query argument descending=true to reverse the order of the output table:

Will return the same as before but in reverse order:

HTTP/1.1 200 OK
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"total_rows"3"offset"0"rows": [
{
"id""doc3""key""doc3""value": {"rev":"74EC24"}}
{
"id""doc2""key""doc2""value": {"rev":"2441HF"}},
{
"id""doc1""key""doc1""value": {"rev""4324BB"}},
]
}

The query string parameters startkey, endkey and limit may also be used to limit the result set. For example:

GET somedatabase/_all_docs?startkey="doc2"&limit=2 HTTP/1.0

Will return:

HTTP/1.1 200 OK
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"total_rows"3"offset"1"rows": [
{
"id""doc2""key""doc2""value": {"rev":"2441HF"}},
{
"id""doc3""key""doc3""value": {"rev":"74EC24"}}
]
}

Use endkey if you are interested in a specific range of documents:

GET somedatabase/_all_docs?startkey="doc2"&endkey="doc3" HTTP/1.0

This will get keys inbetween and including doc2 and doc3; e.g. doc2-b and doc234.

Both approaches can be combined with descending:

GET somedatabase/_all_docs?startkey="doc2"&limit=2&descending=true HTTP/1.0

Will return:

HTTP/1.1 200 OK
Date: Thu, 
17 Aug 2006 05:39:28 +0000GMT
Content
-Type: application/json
Connection: close
{
"total_rows"3"offset"1"rows": [
{
"id""doc3""key""doc3""value": {"rev":"74EC24"}}
{
"id""doc2""key""doc2""value": {"rev":"2441HF"}},
]
}

If you add include_docs=true to a request to _all_docs not only metadata but also the documents themselves are returned.

all_docs_by_seq

NOTE: See /database/_changes as of 0.11

This allows you to see all the documents that were updated and deleted, in the order these actions are done:

GET somedatabase/_all_docs_by_seq HTTP/1.0

Will return:

HTTP/1.1 200 OK
Date: Fri, 
8 May 2009 11:07:02 +0000GMT
Content
-Type: application/json
Connection: close
{
"total_rows"4"offset"0"rows": [
{
"id""doc1""key""1""value": {"rev":"1-4124667444"}},
{
"id""doc2""key""2""value": {"rev":"1-1815587255"}},
{
"id""doc3""key""3""value": {"rev":"1-1750227892"}},
{
"id""doc4""key""4""value": {"rev":"2-524044848""deleted"true}}
]
}

All the view parameters work on _all_docs_by_seq, such as startkey, include_docs etc. However, note that the startkey is exclusive when applied to this view. This allows for a usage pattern where the startkey is set to the sequence id of the last doc returned by the previous query. As the startkey is exclusive, the same document won't be processed twice.

Attachments

Documents can have attachments just like email. There are two ways to use attachments. The first one is inline with your document and it described first. The second one is a separate REST API for attachments that is described a little further down.

A note on attachment names: Attachments may have embedded / characters that are sent unescaped to CouchDB. You can use this to provide a subtree of attachments under a document. A DocID must have any / escaped as %2F. So if you have document a/b/c with an attachment d/e/f.txt, you would be able to access it at http://couchdb/db/a%2fb%2fc/d/e/f.txt .

Inline Attachments

On creation, attachments go into a special _attachments attribute of the document. They are encoded in a JSON structure that holds the name, the content_type and the base64 encoded data of an attachment. A document can have any number of attachments.

When retrieving documents, the attachment's actual data is not included, only the metadata. The actual data has to be fetched separately, using a special URI.

If you need to access attachments with the document in one request, you can pass in the ?attachments=true URL parameter to get the data included in the JSON in the base64 encoded form. Since this puts a significant burden on CouchDB when you request this, you're not advised to use this feature unless you know what you are doing :)

Creating a document with an attachment:

{
"_id":"attachment_doc",
"_attachments":
{
"foo.txt":
{
"content_type":"text\/plain",
"data""VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
}
}
}

Please note that any base64 data you send has to be on a single line of characters, so pre-process your data to remove any carriage returns and newlines.

Requesting said document:

GET /database/attachment_doc

CouchDB replies:

{
"_id":"attachment_doc",
"_rev":1589456116,
"_attachments":
{
"foo.txt":
{
"stub":true,
"content_type":"text\/plain",
"length":29
}
}
}

Note that the "stub":true attribute denotes that this is not the complete attachment. Also, note the length attribute added automatically. When you update the document you must include the attachment stubs or CouchDB will delete the attachment.

Requesting the attachment:

GET /database/attachment_doc/foo.txt

CouchDB returns:

This is a base64 encoded text

Automatically decoded!

Multiple Attachments

Creating a document with two attachments:

{
"_id":"attachment_doc",
"_attachments":
{
"foo.txt":
{
"content_type":"text\/plain",
"data""VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
},
"bar.txt":
{
"content_type":"text\/plain",
"data""VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
}
}
}

Standalone Attachments

Note: This was added in version 0.9 of CouchDB. It is not available in earlier version.

CouchDB allows to create, change and delete attachments without touching the actual document. As a bonus feature, you do not have to base64 encode your data. This can significantly speed up requests since CouchDB and your client do not have to do the base64 conversion.

You need to specify a MIME type using the Content-Type header. CouchDB will serve the attachment with the specified Content-Type when asked.

To create an attachment:

PUT somedatabase/document/attachment?rev=123 HTTP/1.0
Content
-Length: 245
Content
-Type: image/jpeg
<JPEG data>

CouchDB replies:

{"ok"true"id""document""rev""765B7D1C"}

Note that you can do this on a non-existing document. The document and attachment will be created implicitly for you. A revision id must not be specified in this case.

To change an attachment:

PUT somedatabase/document/attachment?rev=765B7D1C HTTP/1.0
Content
-Length: 245
Content
-Type: image/jpeg
<JPEG data>

CouchDB replies:

{"ok"true"id""document""rev""766FC88G"}

To delete an attachment:

DELETE somedatabase/document/attachment?rev=765B7D1C HTTP/1.0

CouchDB replies:

{"ok":true,"id":"document","rev":"519558700"}

To retrieve an attachment:

GET somedatabase/document/attachment HTTP/1.0

CouchDB replies

Content-Type:image/jpeg
<JPEG data>

ETags/Caching

CouchDB sends an ETag Header for document requests. The ETag Header is simply the document's revision in quotes.

For example, a GET request:

GET /database/123182719287

Results in a reply with the following headers:

cache-control: no-cache,
pragma: no
-cache
expires: Tue, 
13 Nov 2007 23:09:50 GMT
transfer
-encoding: chunked
content
-type: text/plain;charset=utf-8
etag: 
"615790463"

POST requests also return an ETag header for either newly created or updated documents.

posted on 2010-05-11 10:20 小默 閱讀(697) 評論(0)  編輯 收藏 引用 所屬分類: Network

導航

統計

留言簿(13)

隨筆分類(287)

隨筆檔案(289)

漏洞

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久国内| 国产精品青草久久| 亚洲精品一线二线三线无人区| 久久国产日韩欧美| 午夜精品久久久久99热蜜桃导演| 一区二区欧美亚洲| 亚洲午夜小视频| 欧美一区日本一区韩国一区| 小辣椒精品导航| 久久视频在线视频| 亚洲免费在线| 国产一区二区三区丝袜| 国产精品日日摸夜夜摸av| 国产日韩精品一区观看| 精品69视频一区二区三区| 亚洲电影在线播放| 一本久久综合亚洲鲁鲁五月天| 宅男噜噜噜66一区二区| 久久se精品一区精品二区| 美女在线一区二区| 日韩视频在线一区二区三区| 亚洲欧美日韩精品久久| 乱中年女人伦av一区二区| 欧美精品久久久久久久免费观看| 国产精品久久二区二区| 亚洲高清电影| 新狼窝色av性久久久久久| 老司机精品久久| 一本大道av伊人久久综合| 午夜精品亚洲一区二区三区嫩草| 欧美+亚洲+精品+三区| 国产精品进线69影院| 在线日韩欧美| 亚洲欧美日韩天堂| 91久久亚洲| 亚洲精品无人区| 久久精品亚洲| 国产精品综合| 亚洲午夜视频| 欧美激情国产日韩| 亚洲免费影视第一页| 欧美精品videossex性护士| 黄色一区二区在线观看| 亚洲综合日韩在线| 亚洲精品日韩在线| 老**午夜毛片一区二区三区| 国产亚洲毛片在线| 欧美亚洲三区| 日韩系列在线| 欧美国产日韩a欧美在线观看| 好看不卡的中文字幕| 国产欧美日韩综合一区在线播放| 日韩视频免费观看| 男同欧美伦乱| 久久一区精品| 亚洲电影视频在线| 欧美 日韩 国产在线| 久久精品国产第一区二区三区最新章节 | 免费观看30秒视频久久| 亚洲一区二区三区免费视频| 欧美日韩中文字幕| aa级大片欧美| 亚洲电影在线看| 久久久99国产精品免费| 娇妻被交换粗又大又硬视频欧美| 亚洲欧美日韩中文在线制服| 日韩一级二级三级| 欧美视频一二三区| 午夜在线一区| 久久成人一区| 激情亚洲成人| 欧美激情免费观看| 欧美黄色免费| 亚洲视频1区2区| 99精品久久| 国产欧美日韩| 麻豆国产va免费精品高清在线| 欧美中在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 免费亚洲电影在线| 老司机午夜精品| 9久草视频在线视频精品| 欧美二区乱c少妇| 欧美人与性动交a欧美精品| 一区二区三区.www| 欧美www视频在线观看| 久久精品夜色噜噜亚洲a∨ | 欧美日韩国产一中文字不卡| 一本一本久久a久久精品综合妖精| 亚洲国产一区二区三区青草影视| 欧美精品在线观看播放| 亚洲综合成人婷婷小说| 亚洲欧美电影在线观看| 亚洲国产精品精华液2区45| 亚洲精品一区二区三区蜜桃久 | 亚洲精品一区在线观看| 亚洲美女视频网| 国产专区欧美精品| 亚洲国产精品久久91精品| 欧美精品一区三区在线观看| 欧美一区二区三区免费在线看| 乱中年女人伦av一区二区| 亚洲视频axxx| 美女免费视频一区| 一区二区三区精品| 久久精品免费播放| 在线亚洲精品| 久久视频国产精品免费视频在线| 亚洲一区二区欧美日韩| 久久久久88色偷偷免费| 亚洲一区久久久| 久久在线91| 久久精品一区二区国产| 欧美日韩情趣电影| 麻豆精品视频在线观看视频| 国产精品久久毛片a| 亚洲黄色影片| 亚洲国产精品一区二区www在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲另类视频| 久久婷婷av| 久久精品人人| 国产精品入口日韩视频大尺度| 欧美激情一区二区三区在线视频观看 | 午夜激情亚洲| 久久综合激情| 久久久精品性| 欧美久久成人| 亚洲风情在线资源站| 国内免费精品永久在线视频| 亚洲一区二区三区中文字幕| 日韩午夜精品| 欧美精品二区三区四区免费看视频| 欧美一区二区视频在线| 国产精品久久久一区二区三区| 亚洲第一精品影视| 一区二区三区在线观看欧美| 欧美中文字幕不卡| 久久久亚洲精品一区二区三区| 国产免费成人av| 午夜精品久久久久久久蜜桃app | 亚洲网址在线| 欧美天堂亚洲电影院在线观看| 亚洲精品国产拍免费91在线| 91久久精品国产91久久| 欧美ed2k| 亚洲国产综合在线| 99热在这里有精品免费| 欧美精品亚洲一区二区在线播放| 亚洲国产日韩欧美一区二区三区| 亚洲第一精品夜夜躁人人躁| 麻豆freexxxx性91精品| 亚洲观看高清完整版在线观看| 亚洲美洲欧洲综合国产一区| 欧美另类专区| 一区二区成人精品| 欧美伊久线香蕉线新在线| 国产一区二区三区高清播放| 久久精品系列| 亚洲韩国青草视频| 亚洲视频一区二区在线观看| 国产精品视频1区| 久久国产精品久久久久久| 欧美大片一区二区三区| 99综合在线| 国产精品有限公司| 国产视频综合在线| 亚洲午夜久久久久久尤物| 国产精品福利片| 香蕉成人伊视频在线观看| 免费一区二区三区| 亚洲永久在线观看| 国产在线麻豆精品观看| 欧美成人亚洲成人日韩成人| 一区二区三区国产精华| 另类激情亚洲| 99精品热视频| 黄色在线一区| 国产精品高清免费在线观看| 久久婷婷国产综合国色天香| 一区二区三区日韩精品视频| 久久久亚洲高清| 中文精品99久久国产香蕉| 国产网站欧美日韩免费精品在线观看| 毛片av中文字幕一区二区| 亚洲一区在线免费观看| 美女黄色成人网| 欧美一区二区三区的| 最新成人av网站| 国产欧美在线观看一区| 欧美精品尤物在线| 欧美自拍偷拍| 一区二区三区欧美视频| 亚洲国产成人精品视频| 欧美亚洲综合网| 亚洲三级免费| 在线国产精品播放| 国产精品欧美日韩久久| 欧美日韩国产黄| 老牛影视一区二区三区|