rest实践3

   1、从mongodb的数据实体Document中获取其中一个字段的值,即例如:doc.getString("pid"),直接显示value。

   2、当从网络上的网址url的图片直接弄到数据库内,即用流。期待输入的request的entity是byte,即存入数据库内的图片是byte。

   3、读取和上传的两种方式:

  • 读取图片。
  • 上传图片的字节流byte。
 (get & parameters('pid,  'seqno.as[Int].?, 'width.as[Int].?, 'height.as[Int].?, 'bson.?)) {
            (pid, optSeq, optWid, optHght, bson) =>
              if(bson==None && optSeq==None){
                val futPicRow: Future[(Document, Seq[Document])] = for {
                  picInfo <- repository.getPicBlob1(pid).toFuture[Document]
                  picBlog <- repository.query2(equal("pid", pid)).toFuture[Seq[Document]]

                } yield (picInfo, picBlog)

                onComplete(futPicRow) {
                  case Success(infoModelAndBlobDoc) =>
                    println("Success")
                    val blob = if(infoModelAndBlobDoc._1==null) {
                      if(infoModelAndBlobDoc._2==Seq()) None
                      else  mgoGetBlobOrNone(infoModelAndBlobDoc._2.head,"pic")
                    }else mgoGetBlobOrNone(infoModelAndBlobDoc._1,"pic")
                    if (blob != None) {
                      withoutSizeLimit {
                        encodeResponseWith(Gzip) {
                          complete(
                            HttpEntity(
                              ContentTypes.`application/octet-stream`,
                              ByteArrayToSource(Imaging.setImageSize(blob.get.getData, optWid.getOrElse(128), optHght.getOrElse(128))
                              ))
                          )
                        }
                      }
                    } else complete(StatusCodes.NotFound)


                  case Failure(err) =>
                    println("失败路线!!!!!")
                    complete(err)
                }
              }else{ val futPicRow:Future[Document]= if (bson == None)
                repository.getPicBlob(pid, optSeq.get).toFuture[Document] //pid+序列号
              else
                repository.getPicBlob2(pid, bson.getOrElse("{}")).toFuture[Document] //bson


                onComplete(futPicRow) {
                  case Success(infoModelAndBlobDoc) =>
                    println("Success")
                    val blob = if (infoModelAndBlobDoc==null) None
                    else  mgoGetBlobOrNone(infoModelAndBlobDoc,"pic")

                    if (blob != None) {
                      withoutSizeLimit {
                        encodeResponseWith(Gzip) {
                          complete(
                            HttpEntity(
                              ContentTypes.`application/octet-stream`,
                              ByteArrayToSource(Imaging.setImageSize(blob.get.getData, optWid.getOrElse(128), optHght.getOrElse(128))
                              ))
                          )
                        }
                      }
                    } else complete(StatusCodes.NotFound)


                  case Failure(err) =>
                    println("失败路线!!!!!")
                    complete(err)
                }
              }
          } ~
  (post & parameters('pid, 'bson.?, 'picUrl)) { (pid, bson, picUrl) =>
          val dlRequest = HttpRequest(
            HttpMethods.GET,
            uri = s"$picUrl"
          )
          val futUrl: Future[HttpResponse] = Http().singleRequest(dlRequest)
          val b = Await.result(futUrl, 3 seconds).entity
          val futBytes =b.withoutSizeLimit.dataBytes.runFold(ByteString()) { case (hd, bs) =>
            hd ++ bs
          }
          val filte=Document(bson.getOrElse("{}"))
          val futmsg: Future[Completed] = for {
            maxSeqno <- repository.query1(equal("pid",pid)).toFuture[Seq[Document]]
            bytes <- futBytes
            d= if(maxSeqno==Seq()) 0 else  maxSeqno.head.getInteger("seqno")+1
            docs = filte + ("pid" -> pid, "seqno" -> d, "pic" -> bytes.toArray)
            //,"desc"->optDesc.get,"width" -> optWid.get,"height" -> optHgh.get
            c <- repository.insert(docs).toFuture[Completed]
          } yield c
          complete(futmsg.map(_.toString))
        } ~
        (post &parameters('pid, 'bson.?)){
          (pid,bson)=>
            val filte = Document(bson.getOrElse("{}"))
            withoutSizeLimit {
              decodeRequest {
                extractDataBytes { bytes =>
                  val futbytes = bytes.runFold(ByteString()) { case (hd, bs) =>
                    hd ++ bs
                  }

                  val futmsg: Future[Completed] = for {
                    maxSeqno <- repository.query1(equal("pid", pid)).toFuture[Seq[Document]]
                    bytes <- futbytes
                    d = if (maxSeqno == Seq()) 0 else maxSeqno.head.getInteger("seqno") + 1
                    docs = filte + ("pid" -> pid, "seqno" -> d, "pic" -> bytes.toArray)

                    c <- repository.insert(docs).toFuture[Completed]
                  } yield c
                  complete(futmsg.map(_.toString))
                }
              }
            }
        }~

引入download方法

(post &parameters('pid, 'bson.?,'pic)){
          (pid,bson,pic)=>
            val filte = Document(bson.getOrElse("{}"))
            val futmsg: Future[Completed] = for {
              pic1 <- downloadPicture(pic)
              maxSeqno <- repository.query1(pid).toFuture[Seq[Document]]
              d = if (maxSeqno == Seq()) 0 else maxSeqno.head.getInteger("seqno") + 1
              docs = filte +  ("pid" -> pid, "seqno" -> d, "pic1" -> pic1.toArray)
              c <- repository.insert(docs).toFuture[Completed]
            } yield c
            complete(futmsg.map(_.toString))
        }~
原文地址:https://www.cnblogs.com/0205gt/p/11320789.html